package org.one.afternoon.websocket;

import com.google.gson.*;
import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import org.java_websocket.server.WebSocketServer;
import org.one.afternoon.provider.xunfei.WebIATWSListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

@Component
@ServerEndpoint("/iatWebSocket/{userId}")
public class IATWebSocket {
    private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);

    /**
     * 当前在线连接数
     */
    private static AtomicInteger onlineCount = new AtomicInteger(0);

    /**
     * 用来存放每个客户端对应的 WebSocketServer 对象
     */
    private static ConcurrentHashMap<String, IATWebSocket> webSocketMap = new ConcurrentHashMap<String, IATWebSocket>();

    /**
     * 与某个客户端的连接会话，需要通过它来给客户端发送数据
     */
    private Session session;

    /**
     * 接收 userId
     */
    private String userId = "";

    public static String firstFrame = "";

    public static List<String> middleFrame = new ArrayList<>();

    public static String lastFrame = "";

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        this.session = session;
        this.userId = userId;
        if (webSocketMap.containsKey(userId)) {
            webSocketMap.remove(userId);
            webSocketMap.put(userId, this);
        } else {
            webSocketMap.put(userId, this);
            addOnlineCount();
        }
        log.info("用户连接:" + userId + ",当前在线人数为:" + getOnlineCount());
//        try {
//            sendMessage("连接成功！");
//        } catch (IOException e) {
//            log.error("用户:" + userId + ",网络异常!!!!!!");
//        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        if (webSocketMap.containsKey(userId)) {
            webSocketMap.remove(userId);
            subOnlineCount();
        }
        log.info("用户退出:" + userId + ",当前在线人数为:" + getOnlineCount());
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        WebIATWSListener.result = "";
        log.info("用户消息:" + userId + ",报文:" + message);
        String frame = new Gson().toJson(message);
        // 使用JsonParser来解析JSON字符串
        JsonParser parser = new JsonParser();
        JsonElement jsonElement = parser.parse(message);

        // 确保解析的对象是一个JsonObject
        if (jsonElement.isJsonObject()) {
            JsonObject jsonObject = jsonElement.getAsJsonObject();

            JsonObject dataObject = jsonObject.getAsJsonObject("data");

            // 提取"status"的值
            if (dataObject.has("status")) {
                int status = dataObject.get("status").getAsInt();
                System.out.println("Status: " + status);
                if (status == 0) {
                    firstFrame = message;
                } else if (status == 1) {
//                    if ("".equals(middleFrame)) {
//                        middleFrame = message;
//                    } else {
//                        if (dataObject.has("audio")) {
//                            log.info("到这里应该没毛病--------------------------------");
//                            updateMiddleFrame(message);
//                        }
//                    }
                    middleFrame.add(message);
                } else if (status == 2) {
                    lastFrame = message;
                    try {
                        WebIATWSListener.connect(firstFrame, middleFrame, lastFrame);
                    } catch (Exception e) {
                        log.error(e.getMessage());
                    }
                    while (true) {
                        if (WebIATWSListener.end) break;
                    }
                    try {
                        webSocketMap.get(userId).sendMessage(WebIATWSListener.result);
                    } catch (IOException e) {
                        log.error(e.getMessage());
                    }
                }
            } else {
                System.out.println("Status not found in the JSON object.");
            }
        } else {
            System.out.println("The JSON string is not a valid JSON object.");
        }
    }

    /**
     * 发生错误时调用
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("用户错误:" + this.userId + ",原因:" + error.getMessage());
//        error.printStackTrace();
    }

    /**
     * 实现服务器主动推送
     */
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }

    public static synchronized AtomicInteger getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        onlineCount.getAndIncrement();
    }

    public static synchronized void subOnlineCount() {
        onlineCount.getAndDecrement();
    }

//    public static void updateMiddleFrame(String frame) {
//
//        // (1):转为JsonObject
//
//        // 构建Json格式解析器
//        // JsonParser parser = new JsonParser();
//
//        // 构建新旧frameElement
//        // JsonElement newFrameElement = parser.parse(frame);
//        // JsonElement originalFrameElement = parser.parse(middleFrame);
//
//        // log.info(String.valueOf(newFrameElement));
//        // log.info(String.valueOf(originalFrameElement));
//        // log.info("1...");
//
//        // log.info(frame);
//        // log.info(middleFrame);
//        // 构建新旧frameObject
//        // JsonObject newFrameObject = newFrameElement.getAsJsonObject();
//        // JsonObject originalFrameObject = originalFrameElement.getAsJsonObject();
//
//        // log.info("2...");
//
//        // 构建新旧dataObject
//        // JsonObject newFrameDataObject = newFrameObject.getAsJsonObject("data");
//        // JsonObject originalFrameDataObject = originalFrameObject.getAsJsonObject("data");
//
//        // String newFrameData = newFrameDataObject.get("audio").getAsString();
//        // String originalFrameData = originalFrameDataObject.get("audio").getAsString();
//
//        // originalFrameDataObject.addProperty("audio", newFrameData + originalFrameData);
//
//        // middleFrame = new Gson().toJson(originalFrameObject);
//        // log.info("新的middleFrame-->" + middleFrame);
//
//
//        // (2):转为具体Java类
//
//        // JsonParser parser = new JsonParser();
//
//        // JsonElement newFrameElement = parser.parse(frame);
//        // JsonElement originalFrameElement = parser.parse(middleFrame);
//
//        // log.info("newFrameElement->" + newFrameElement.toString());
//        // log.info("originalFrameElement->" + originalFrameElement);
//        // Data newFrameData = new Gson().fromJson(newFrameElement.toString().substring(1, newFrameElement.toString().length() - 1), Data.class);
//        // Data oldFrameData = new Gson().fromJson(originalFrameElement.toString().substring(1, originalFrameElement.toString().length() - 1), Data.class);
//
//        // oldFrameData.setAudio(oldFrameData.getAudio() + newFrameData.getAudio());
//
//        // Gson gson = new GsonBuilder().setPrettyPrinting().create();
//        // middleFrame = gson.toJson(oldFrameData);
//
//        // (3):Jackson
//
//        JsonParser parser = new JsonParser();
//
//        ObjectMapper objectMapper = new ObjectMapper();
//        Frame newFrameData = null;
//        log.info(frame);
//        try {
//            newFrameData = objectMapper.readValue(frame, Frame.class);
//            Frame oldFrameData = objectMapper.readValue(middleFrame, Frame.class);
//            oldFrameData.getData().setAudio(oldFrameData.getData().getAudio() + newFrameData.getData().getAudio());
//            middleFrame = objectMapper.writeValueAsString(oldFrameData);
//        } catch (JsonProcessingException e) {
//            log.error(e.getMessage());
//        }
//    }
}

